#ifndef _USART_H_
#define _USART_H_

#include "Global.h"

//=========================== 以下根据寄存器定义，用户不需要修改  ================================//

#define TXSTA_SYNC_MASTER       0b10000000      //  同步模式下主控功能
#define TXSTA_SYNC_SLAVE        0b00000000      //  同步模式下从机功能
#define TXSTA_TX9EN             0b01000000      //  9位发送模式
#define TXSTA_TX9DIS            0b00000000      //  8位发送模式
#define TXSTA_TXEN              0b00100000      //  发送使能
#define TXSTA_MODE_SYNC         0b00010000      //  同步模式
#define TXSTA_MODE_ASYNC        0b00000000      //  异步模式
#define TXSTA_SYNC_SCKP_LOW     0b00000000      //  同步模式：上升沿传输数据；  异步模式：直接字符发送到TX
#define TXSTA_SYNC_SCKP_HIGH    0b00001000      //  同步模式：下降沿传输数据；  异步模式：字符取反发送到TX
#define TXSTA_TXD9              0b00000000      //  发送数据第9位

#define RCSTA_SPEN              0b10000000      //  串口使能【端口切为串口】
#define RCSTA_SPDIS             0b00000000      //  禁止串口功能
#define RCSTA_RX9EN             0b01000000      //  接收9位数据
#define RCSTA_RX9DIS            0b00000000      //  接收8位数据

#define RCSTA_SREN              0b00100000      //  同步主控模式下：使能单字节接收
#define RCSTA_SRDIS             0b00000000      //  同步主控模式下：禁止单字节接收
#define RCSTA_CREN              0b00010000      //  异步模式：使能接收; 同步主控模式：使能连续接收直到清零CREN使能位
#define RCSTA_CRDIS             0b00000000      //  异步模式：禁止接收; 同步主控模式：禁止连续接


#define BAUDRATE_9600           103
#define BAUDRATE_19200          51


//=========================== 用    户    配    置  ================================//
#define BAUDRATE_CFG            BAUDRATE_19200
#define TXSTA_CFG               TXSTA_TXEN + TXSTA_MODE_ASYNC
#define RCSTA_CFG               RCSTA_SPEN + RCSTA_CREN
#define MAX_TXBUF_SIZE          16                      //  最大发送缓冲区大小
#define MAX_RXBUF_SIZE          16                      //  最大接收缓冲区大小
#define MAX_TIMEOUT_RX          10                      //  RX接收超时时间【*1ms】
#define MIN_RX_COUNT            10                      //  RX最少接收数据个数【超时后如果接收数据超过此数值则将产生事件】


//=========================== 宏    接    口  ================================//
#define IS_TX_IDLE()            TRMT                    //  发送移位寄存器状态为空
#define IS_RX_IDLE()            RCIDL                   //  接收空闲
#define IS_RX_FRAME_ERROR()     FERR                    //  帧错误
#define IS_RX_OVER_ERROR()      OERR                    //  溢出错误
#define GET_RX9()               RX9D                    //  接收数据第9位
#define EN_TX_INT()             do{TXIE = YES;}while(0) // 使能发送中断
#define DIS_TX_INT()            do{TXIE = NO;}while(0)  // 禁止发送中断
#define EN_RX_INT()             do{RCIE = YES;}while(0) // 使能接收中断
#define DIS_RX_INT()            do{RCIE = NO;}while(0)  // 禁止接收中断
#define USART_PORT_EN()         do{SPEN = YES;}while(0) // 串行端口使能
#define USART_PORT_DIS()        do{SPEN = NO;}while(0)  // 串行端口禁止
#define USART_TX_EN()           do{TXEN = YES;}while(0) // 使能发送
#define USART_TX_DIS()          do{TXEN = NO;}while(0)  // 禁止发送
#define USART_RX_EN()           do{CREN = YES;}while(0) // 使能接收
#define USART_RX_DIS()          do{CREN = NO;}while(0)  // 禁止接收
#define IS_TX_IRQ()             TXIF==1                 // 判断是否有发送中断请求【发送结束】
#define RESET_TX_IRQ()          do{TXIF=NO;}while(0)    // 清除发送使能
#define IS_RX_IRQ()             RCIF==1                 // 判断是否有接收中断请求【接收到数据】
#define RESET_RX_IRQ()          do{RCIF=NO;}while(0)    // 清除接收使能
#define USART_TX_DATA(dat)      do{TXREG = dat; while(!IS_TX_IDLE());}while(0) // 发送一个字节数据

//=========================== 全    局    变    量  ================================//
extern uint8 USART_RxCnt;
extern vuint8 USART_RxBuf[MAX_RXBUF_SIZE];

//=========================== 接    口    函    数  ================================//
void initUSART(void);
void USART_RecvProc(void);
void USART_SendByte(uint8 dat);
void USART_SendBuf(uint8* buf, uint8 size);
void USART_TimeProc(void);

#endif
